package tree;
/**
* Implementation legere d'un arbre binaire
* @author Kevin Georgy
* @since 13.06.2007	
* @version 1.0
*/

public class Tree<X> {
	
	/**
	* Branche gauche
	*/
	Tree<X> left;
   
	/**
	* Branche droite
	*/
	Tree<X> right;
   
	/**
	* Parent
	*/
   	Tree<X> parent;
	
	/**
	* Contenu
	*/
	X content;
	
	/**
	* Construit un arbre avec la valeur aContent
	* @param aContent Contenu de l'arbre cree
	*/
	public Tree(X aContent) {
		content = aContent;
	}
	
	/**
	* Definit le contenu de l'arbre
	* @param aContent Nouveau contenu
	*/
	public void setContent(X aContent) {
		content = aContent;
	}
	
	/**
	* Retourne le contenu de l'arbre
	* @return Contenu
	*/
	public X getContent() {
		return content;
	}
	
	/**
	* Retourne l'arbre connecte a gauche
	* @return Sous-arbre gauche
	*/
	public Tree<X> left() {
		return left;
	}
	
	/**
	* Retourne l'arbre connecte a droite
	* @return Sous-arbre droit
	*/
	public Tree<X> right() {
		return right;
	}
	
	/**
	* Retourne l'arbre parent
	* @return Arbre parent
	*/
	public Tree<X> parent() {
		return parent;
	}
	
	/**
	* Connecte l'arbre aLeft a gauche
	* @param aLeft Arbre a connecter a gauche
	*/
	public void connectLeft(Tree<X> aLeft) {
		left = aLeft;
		aLeft.parent = this;
	}
	
	/**
	* Connecte l'arbre aRight a droite
	* @param aRight Arbre a connecter a droite
	*/
	public void connectRight(Tree<X> aRight) {
		right = aRight;
		aRight.parent = this;
	}
	
	/**
	* Deconnecte un arbre de son parent
	*/
	public void disconnect() {
      
		// Defait le lien du parent
		if (parent != null)
			if (parent.left == this)
				parent.left = null;
			else if (parent.right() == this)
				parent.right = null;
      		else
			// Defait son lien
			parent = null;
	}
	
	/**
	* Efface l'arbre
	*/
	public void clear() {
 		content = null;
		if (left != null)
			left.clear();
		if (right != null)
			right.clear();
		disconnect();
	}

}
